package watcher

import (
	"github.com/goccy/go-json"
	"time"
)

// 最小检测周期数值
var MIN_CHECK_INTERVAL_SECOND int = 3

// 服务信息与状态
type ServiceInfoAndStatus struct {
	// 服务基础信息
	ServiceInfoBase
	// 服务状态
	ServiceInfoStatus
}

func (s *ServiceInfoAndStatus) UnmarshalBinary(data []byte) error {
	return json.Unmarshal(data, s)
}

func (s *ServiceInfoAndStatus) MarshalBinary() (data []byte, err error) {
	return json.Marshal(s)
}

// 服务基础信息
type ServiceInfoBase struct {
	// 服务ID
	ServiceID string `json:"service_id"`
	// 服务名称，同一类服务使用相同名称，例如“设备接入中心”
	ServiceName string `json:"service_name"`

	// 标准tags 可以为空，存储小量数据，可做查询条件，查询服务时做为返回值的一部分
	ServiceTags []string `json:"service_tags"`
	// 是否存在大数据tags
	HaveBigDataTags bool `json:"have_big_data_tags"`

	// 服务地址信息配置列表
	ServiceInfoSvcAddressInfoCfgList []ServiceInfoSvcAddressInfoCfg `json:"service_info_svc_address_info_cfg_list"`
	// 健康检查配置
	ServiceInfoCheckCfg
}

// 服务信息-服务地址信息配置
type ServiceInfoSvcAddressInfoCfg struct {
	//服务类型，取值为 1=“http”、2=“thrift”
	ServiceAddressType int `json:"service_address_type"`

	// 服务地址用途,如对应"OpenApi","ConnectCenter"等
	ServiceAddressUsage string `json:"service_address_usage"`

	/// 内部信息，同一个k8s环境中可以使用此类值

	// 服务IP
	ServiceAddressIP string `json:"service_address_ip"`
	// 服务域名地址
	ServiceAddressDomainName string `json:"service_address_domain_name"`
	// 服务端口
	ServiceAddressPort string `json:"service_address_port"`

	/// 外部信息， 如在k8s环境中，有nodePort映射时，可填写此类值用于k8s环境外调度

	// 服务公开IP
	ServiceAddressPubIP string `json:"service_address_pub_ip"`
	// 服务公开域名地址
	ServiceAddressPubDomainName string `json:"service_address_pub_domain_name"`
	// 服务公开端口
	ServiceAddressPubPort string `json:"service_address_pub_port"`
}

// 服务信息-健康检查配置
type ServiceInfoCheckCfg struct {
	// 健康检查服务类型，取值为 1=“http”、2=“thrift”
	CheckAddressType int `json:"check_address_type"`
	// 健康检查端口: 8080
	CheckPort string `json:"check_port"`
	// 健康检查路径: 建议="/check-"+serviceID
	CheckUri string `json:"check_uri"`
	// 健康检查超时（秒），建议=3
	CheckTimeout int `json:"check_timeout"`
	// 健康检查间隔（秒），最小值3秒，建议>=5
	CheckInterval int `json:"check_interval"`
	// 注销时间，健康检查失败如果超过此时间则删除服务，相当于过期时间（秒），建议=CheckInterval*2+CheckTimeout+2
	CheckDeregisterServiceAfter int `json:"check_deregister_service_after"`
}

// 服务信息-服务状态
type ServiceInfoStatus struct {
	//服务注册时间
	StatusRegTime time.Time `json:"status_reg_time"`
	//服务是否在线
	StatusOnline bool `json:"status_online"`
	//服务最后一次检测成功的时间
	StatusLastCheckSuccessTime time.Time `json:"status_last_check_success_time"`
}
